/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package serversocket;
import java.util.ArrayList;
import java.util.Date;
/**
 *
 * @author Lawrence
 */
public class Notificacion {

    private ArrayList<Estacion> estaciones = new ArrayList<Estacion>();
    private static int indice;
    private int id_viajero;
    private ArrayList<Mensaje> mensajes = new ArrayList<Mensaje>();

    public ArrayList<Mensaje> getMensajes() {
        return mensajes;
    }

    public void setMensajes(ArrayList<Mensaje> mensajes) {
        this.mensajes = mensajes;
    }

    public ArrayList<Estacion> getEstaciones() {
        return estaciones;
    }

    public void setEstaciones(ArrayList<Estacion> estaciones) {
        this.estaciones = estaciones;
    }

    public int getId_viajero() {
        return id_viajero;
    }

    public void setId_viajero(int id_viajero) {
        this.id_viajero = id_viajero;
    }



    public Notificacion()
    {
    }

    public int getIndice() {
        return indice;
    }

    public void setIndice(int indice) {
        Notificacion.indice = indice;
    }

    /*
     * divide el camion en mensajes
     */
    public String  revisarCamion(String camion)
    {
         String [] mensaje = camion.split("&");
         String respuesta = "";
         if(mensaje.length > 0)
         {
             respuesta = respuesta + procesarMsj(mensaje[0]);
             if(mensaje.length == 2)
             {
                 respuesta = respuesta + procesarMsj(mensaje[1]);
             }
         }
         return respuesta;
    }

    private String procesarMsj(String mensaje)
    {
        String[] miMensaje = mensaje.split("%");


        if(miMensaje.length > 4)
        {
            this.id_viajero = Integer.parseInt(miMensaje[1]);

            if(miMensaje.length == 5)
            {
                mensaje = mensaje +"%"+ String.valueOf(Notificacion.indice);
                miMensaje = mensaje.split("%");
                Notificacion.indice++;
            }
            comprobarEstacion(miMensaje,2,mensaje);
            mensaje = mensaje+"&";
        }
        else
        {
            if(miMensaje.length==3)
            {
               mensaje = mensaje +"%"+ String.valueOf(Notificacion.indice);
               miMensaje = mensaje.split("%");
               Notificacion.indice++;

            }
            else
            {
                return mensaje+"&";
            }
            comprobarEstacion(miMensaje,0,mensaje);
        }

        return mensaje;
    }

    private void comprobarEstacion(String [] miMensaje,int posicion,String mensaje)
    {
        Estacion miEstacion;
        if(this.estaciones.isEmpty() || buscarEstacion(this.estaciones)==-1 )
        {
            miEstacion = new Estacion();
            miEstacion.setId_estacion(this.id_viajero);
            this.estaciones.add(miEstacion);
            clasificarMsj(miEstacion,miMensaje,posicion);
        }
        else
        {
            clasificarMsj(this.estaciones.get(buscarEstacion(this.estaciones)),miMensaje,posicion);
        }

    }

    private void clasificarMsj(Estacion miEstacion,String [] miMensaje, int posicion)
    {
        Mensaje mensaje = new Mensaje();
        mensaje.setDestino(Integer.parseInt(miMensaje[posicion]));
        mensaje.setOrigen(Integer.parseInt(miMensaje[posicion+1]));
        mensaje.setMensaje(miMensaje[posicion+2]);
        mensaje.setId_mensaje(miMensaje[miMensaje.length-1]);

        if(this.id_viajero == mensaje.getOrigen())//El mensaje lo esta enviando esta sucursal
        {
            mensaje.setHrEmision(new Date());
            miEstacion.getEnviados().add(mensaje);
        }
        else if(this.id_viajero == mensaje.getDestino())//El mensaje esta destinado a esta sucursal
        {
            mensaje.setHrRecepcion(new Date());
            mensaje.setRecibido(true);
            miEstacion.getRecibidos().add(mensaje);
        }
        else //El mensaje hace escala en esta sucursal
        {
            miEstacion.getViajeros().add(mensaje);
        }
        registrarMensaje(mensaje);
    }

    private int buscarEstacion(ArrayList<Estacion> estaciones)
    {
        for(int i=0;i<estaciones.size();i++)
        {
            if(estaciones.get(i).getId_estacion()==this.id_viajero)
            {
                return i;
            }
        }
        return -1;
    }

    private void registrarMensaje(Mensaje mensaje)
    {
            Traza miTraza = new Traza();
            miTraza.setId_sucursal(id_viajero);
            miTraza.setHrLlegada(new Date());

        if(this.mensajes.isEmpty() || buscarMensaje(this.mensajes,mensaje.getId_mensaje())==-1)
        {
            mensaje.getTrayecto().add(this.id_viajero);
             mensaje.getTraza().add(miTraza);
            this.mensajes.add(mensaje);
        }
        else
        {
            //Trayecto
            this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getTrayecto().add(this.id_viajero);
            //Traza
            this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getTraza().add(miTraza);
            //Destino se verifica el destino
            if(mensaje.getHrRecepcion()!=null)
            {
                this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).setHrRecepcion(mensaje.getHrRecepcion());
                double tiempoAcumulado = this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getHrRecepcion().getTime()-
                        this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getHrEmision().getTime();
                tiempoAcumulado = Math.abs(tiempoAcumulado/1000);
                this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).setTiempoTotal(tiempoAcumulado);
            }
        }
    }

    private int buscarMensaje(ArrayList<Mensaje> mensajes,int id_mensaje)
    {
        for(int i=0;i<mensajes.size();i++)
        {
            if(mensajes.get(i).getId_mensaje()==id_mensaje)
            {
                return i;
            }
        }
        return -1;
    }

    private void registrarSalidaMsj(int id_sucursal, int id_mensaje)
    {
        int posMsj =buscarMensaje(this.mensajes,id_mensaje);
        int posTza =buscarTraza(this.mensajes.get(buscarMensaje(this.mensajes,id_mensaje)).
                getTraza(),id_sucursal);

        this.mensajes.get(posMsj).getTraza().get(posTza).setHrSalida(new Date());

        double tiempo =  this.mensajes.get(posMsj).getTraza().get(posTza).getHrSalida().getTime() -
                 this.mensajes.get(posMsj).getTraza().get(posTza).getHrLlegada().getTime();
        tiempo = Math.abs(tiempo/1000);
        this.mensajes.get(posMsj).getTraza().get(posTza).setTiempoAcum(tiempo);

    }

    public void anunciarSalida(String mensaje)
    {
        String [] miMensaje = mensaje.split("%");
        if(mensaje.length() == 6)
        {
            registrarSalidaMsj(this.id_viajero,Integer.parseInt(miMensaje[5]));
        }
        else
        {
            registrarSalidaMsj(this.id_viajero,Integer.parseInt(miMensaje[3]));
        }
    }

    public void revisarSalidaCamion(String camion)
    {
        String [] mensaje = camion.split("&");

        for(int i=0;i<mensaje.length;i++)
        {
            anunciarSalida(mensaje[i]);
        }
    }

    private int buscarTraza(ArrayList<Traza> trazas,int id_sucursal)
    {
        for(int i=0;i<trazas.size();i++)
        {
            if(trazas.get(i).getId_sucursal()==id_sucursal)
            {
                return i;
            }
        }
        return -1;
    }
}
